﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;

namespace DataService.Core.Common
{
    /// <summary>
    /// 调用链
    /// </summary>
    public class StackFrameHelper
    {
        ///// <summary>
        ///// 返回当前方法的类名
        ///// </summary>
        //public static string CurrentClassName
        //{
        //    get
        //    {
        //        string className = MethodBase.GetCurrentMethod().ReflectedType.Name;
        //        return className;
        //    }
        //}

        public static List<string> GetStackFrame()
        {
            List<string> classNames = new List<string>();
            //trace.GetFrame(1).GetMethod();
            //这个括号里面的参数从0开始，0就是自己，1就是上一个，2就是上上一个3就是上上上一个
            //如果再上面没有了的话，就会返回一个异常字符串，你判断这个异常字符串是什么
            //string className = MethodBase.GetCurrentMethod().ReflectedType.Name;

            StackTrace trace = new StackTrace();
            //  StackFrame stackFrame = trace.GetFrame(1);
            //var methodName = stackFrame.GetMethod();
            StackFrame?[] stackFrames = trace.GetFrames();
            if (stackFrames == null)
            {
                return new List<string>();
            }
            foreach (StackFrame item in stackFrames)
            {

                //MethodBase method = item.GetMethod();
                //string methodName = method.Name; // 方法名
               
                //string fileName = item?.GetFileName(); // 文件名
                //int lineNumber = stackFrame.GetFileLineNumber(); // 行号

                var methodBase = item?.GetMethod();
                if (methodBase != null)
                {
                    string className = methodBase.DeclaringType.Name; // 类名
                    classNames.Add($"【{className}.{methodBase.Name}】");
                }
            }
            if (classNames.Count > 1)
            {
                classNames = classNames.Skip(1).ToList();
                classNames.Reverse();
            }

            return classNames;
        }

    }
}
